<?php

/**
 * @author Barkowsky Igor
 * @copyright 2008
 * @package MyCMS
 * @subpackage mysql.php
 */
class DBx
{
	var $pfx;
	var $counter;
	var $link;
	var $error=array();
	function __construct($host,$database,$user,$password,$pfx)
	{
		$this->pfx = $pfx;
		$connect = mysql_connect($host,$user,$password);
		if($connect)
		{
			$res=mysql_select_db($database);
			if($res)
			{
				$this->link=$connect;
				$this->query("SET NAMES 'utf8'");
				return true;
			}
			else
			{
				echo("<br>Не могу подключиться к таблице $database<br>");
				return false;
			}
		}
		else
		{
			echo("<br>Ошибка при подключении к серверу БД!<br>");
			return false;
		}
	}
	/** function *query* make query to database and return result or false on error
	 */
	function query($query)
	{
		$sql = mysql_query($query, $this->link);
		if($sql)
		{
			$this->counter++;
			return $sql;
		}
		else
		{
			print_r(mysql_error($this->link));
			$this->error[]=mysql_error($this->link);
			//echo("Ошибка в запросе к базе данных. <BR>Файл: ".__FILE__."<br>Строка: ".__LINE__."<br>Переданный запрос: ".$query."<br>Текст ошибки: ".mysql_error()."<br>Backtrace:<br>");
			$this->backtrace(debug_backtrace());die();
			return false;
		}
	}
	/** метод insert вставляет значения массива $values в таблицу $table
	 * ВАЖНОЕ ЗАМЕЧАНИЕ! Если в таблице имеется поле с доп. значением autoincrement, то следует удалить из массива аргументов соответствующий ключ во избежание ошибки вставки
	 */
	function insert($table,$values)
	{
		if(!empty($values))
		{
			$query="INSERT INTO $table ";
			$table_columns=array_keys($values);
			$table_values=array_values($values);
			$query_columns="(`".implode("`,`",$table_columns)."`) ";
			foreach($table_values as $k=>$v)
			{
				$table_values[$k]=mysql_real_escape_string($v);
			}
			$query_values="VALUES ('".implode("','",$table_values)."')";
			$insert_query=$query.$query_columns.$query_values;
			$sql=$this->query($insert_query);
			if($sql!=false)
				return true;
			else
				return false;
		}
		else
		{
			$this->error[]="Передан пустой массив для вставки в БД";
			//echo "Передан пустой массив для вставки в БД";
			return false;
		}
	}
	/** метод update обновляет выбранные в $clause записи значениями из массива $values
	 * возвращает true или false в зависимости от успешности
	 */
	function update($table,$values,$clause="WHERE 1")
	{
		if(!empty($values))
		{
			$comma=count($values);
			foreach($values as $k=>$v)
			{
				$query_set.="`".$k."`='".mysql_real_escape_string($v)."'";
				if($comma>1)
					$query_set.=",";
				$comma--;
			}
			$query="UPDATE ".$table." SET ".$query_set." ".$clause;
			$sql=$this->query($query);
			if($sql!=false)
				return true;
			else
				return false;
		}
		else
		{
			$this->error[]="Передан пустой массив для обновления таблицы в БД";
			echo "Передан пустой массив для вставки обновления таблицы в БД";
			return false;
		}
	}
	function fetch_one($query,$result_type=MYSQL_BOTH)
	{
		$sql = $this->query($query);
		if(mysql_num_rows($sql) > 0)
		{
			return mysql_fetch_array($sql,$result_type);
		}
		else
		{
			return false;
		}
	}
	function fetch_array($query,$result_type=MYSQL_BOTH)
	{
		$ar = array();
		$sql = $this->query($query);
		if (mysql_num_rows($sql) > 0)
		{
			while ($row = mysql_fetch_array($sql,$result_type))
				$ar[] = $row;
			return $ar;
		}
		else
			return false;
	}
	/**
	** Возвращает  массив - список ВСЕХ записей полученных запросом $query ($ar = array (value_1, value_2, ..., val_n)
	** В запросе должны извлекаться значения только одного столбца пример: SELECT id FROM ...
	**/
	function fetch_list($query)
	{
		$ar = array();
		$sql = $this->query($query);
		if (mysql_num_rows($sql) > 0)
		{
			while ($row = mysql_fetch_array($sql))
			$ar[] = $row[0];
		}
		return $ar;
	}
	/**
	 * Метод last_id() Возвращает id последней вставленной записи
	 */
	function last_id()
	{
		return mysql_insert_id($this->link);
	}
	function backtrace($backtrace)
	{
		//print_var($backtrace);
		print '<p class="error">Фатальная ошибка в запросе к БД<br>';
		print $this->error[count($this->error)].'<br>';
		if(isset($backtrace[0]['args']))
		{
			print "Переданные аргументы: ";
			foreach($backtrace[0]['args'] as $k=>$v)
			{
				print_r($v);print "<br>";
			}
		}
		print '<ol>';
		foreach($backtrace as $k=>$v)
		{
			print "<li>Функция <b>".$v['function']."</b> в строке <b>".$v['line']."</b> файла <b>".$v['file']."</b></li>";
		}
		print '</ol></p>';
	}
	
	function disconnect()
	{
		mysql_close($this->link);
	}
	function get_last_error()
	{
		return end($this->error);
	}
	function DBx($host,$database,$user,$password,$pfx)
	{
		$this->__construct($host,$database,$user,$password,$pfx);
	}
}



?>